# 1-导包
import traceback
from api.api_register_login import ApiRegisterLogin
import pytest

from common.DBUTIL import clear_data
from data.register_login import img_code, phone_code, register_data,login,login_status
import time
from api import log
import requests
from common.DBUTIL import clear_data



# 2-定义接口测试类
class Test01RegisterLogin:

    # 测试初始化
    def setup(self):
        # 初始化一个session对象
        self.session = requests.Session()

        # 2.1 实例化注册登录接口封装类，后续通过实例调用类下面的方法
        self.register = ApiRegisterLogin(self.session)

    def setup_class(self):
        clear_data()


    # 测试结束清理
    def teardown(self):
        # 关闭会话
        self.session.close()

    # 1- 定义获取图片验证码接口 测试
    @pytest.mark.parametrize("param", img_code) # 实现参数化数据驱动参数，img_code是数据驱动所需要的列表套元祖，类似[(x1,y1),(x2,y2),(x3,y3)]
    def test_01_img_code(self, param):
        # 异常处理
        try:
            log.info("参数化执行参数值：{}".format(param))
            # 通过实例调用封装的接口方法，执行接口测试，获取响应结果
            res = self.register.api_img_code(r=param["r"])
            # 输出响应结果
            log.info("1-{}测试响应结果：{}".format(param["desc"], res.status_code))
            # 断言测试结果是否通过
            assert param["except_code"] == res.status_code
        except Exception as e:
            # 打印异常信息
            log.error("1-{}测试出现异常：{}".format(param["desc"], traceback.format_exc()))  # traceback.format_exc() 记录详细的出错信息
            # 抛出异常
            raise

    # 2- 获取短信验证码接口 测试
    @pytest.mark.parametrize("param", phone_code)
    def test_02_phone_code(self, param):
        try:
            # 执行获取图片验证码接口测试
            res1 = self.register.api_img_code(r=0.123456)
            log.info("1-获取图片验证码测试响应结果：{}".format(res1.status_code))
            log.info("1-获取图片验证码测试cookie:{}".format(res1.cookies))
            # 执行获取短信验证码接口测试
            res2 = self.register.api_phone_code(phone=param["phone"], imgVerifyCode=param["imgVerifyCode"], type="reg")
            # 输出测试响应的结果
            log.info("2-{}测试返回结果：{}".format(param["desc"],res2.json()))
            log.info("2-{}测试cookie:{}".format(param["desc"],res2.request.headers))
            assert param["ecpect_text"] in res2.text

            '''定位出错问题，出错信息排查演示'''
            # 1.1-打印请求头和请求体
            log.info("接口请求头：{}".format(res2.request.headers))
            log.info("接口请求体：{}".format(res2.request.body))
            # 1.2 -打印响应的状态码和响应头和响应体
            log.info("接口响应状态码：{}".format(res2.status_code))
            log.info("接口响应头：{}".format(res2.headers))
            log.info("接口响应体：{}".format(res2.text))
        except Exception as e:
            # 打印异常信息
            log.error("2-{}测试出现异常：{}".format(param["desc"],traceback.format_exc()))  # traceback.format_exc() 记录详细的出错信息
            # 抛出异常
            raise

    # 3- 注册接口 测试
    @pytest.mark.parametrize("param", register_data)
    def test_03_register(self, param):
        try:
            # 执行获取图片验证码接口测试
            self.register.api_img_code(r=0.123456)
            # 执行获取短信验证码接口测试
            self.register.api_phone_code(phone=param["phone"], imgVerifyCode=8888, type="reg")
            # 执行注册接口测试
            res = self.register.api_register(phone=param["phone"], password=param["password"],
                                             verifycode=param["verifycode"], phone_code=param["phone_code"],
                                             dy_server="on", invite_phone="")
            # 输出测试响应的结果
            log.info("3-{}测试返回结果：{}".format(param["desc"],res.json()))
            assert param["expect_text"] in res.text
        except Exception as e:
            # 打印异常信息
            log.error("3-{}测试出现异常：{}".format(param["desc"],traceback.format_exc()))  # traceback.format_exc() 记录详细的出错信息
            # 抛出异常
            raise

    # 4- 登录接口 测试
    @pytest.mark.parametrize("param", login)
    def test_04_login(self,param):
        try:
            log.info("参数化迭代参数结果：{}".format(param))
            if "error" in param["password"]:  # 登录失败3次解锁情况处理
                # 首次循环执行3次错误的登录
                for i in range(3):
                    self.register.api_login(keywords=param["keywords"], password=param["password"])
                # 等待60秒
                time.sleep(60)
                # 执行正常的登录，验证登录是否成功
                res = self.register.api_login(keywords=param["keywords"], password="test123")
                # 输出测试的响应结果
                log.info("4-{}测试返回结果：{}".format(param["desc"], res.json()))
                assert param["expect_text"] in res.text
            else:
                # 执行登录接口测试
                res = self.register.api_login(keywords=param["keywords"], password=param["password"])
                # 输出测试的响应结果
                log.info("4-{}测试返回结果：{}".format(param["desc"],res.json()))
                assert param["expect_text"] in res.text
        except Exception as e:
            # 打印异常信息
            log.error("4-{}测试出现异常：{}".format(param["desc"],traceback.format_exc()))  # traceback.format_exc() 记录详细的出错信息
            # 抛出异常
            raise

    # 5 获取登录状态接口 测试
    @pytest.mark.parametrize("param", login_status)
    def test_05_login_status(self,param):
        try:
            log.info("参数化迭代参数结果：{}".format(param))
            if param["password"] != "":
                # 执行登录接口测试
                self.register.api_login(keywords=param["phone"], password=param["password"])
            # 查询登录状态接口测试
            res = self.register.api_login_status()
            # 输出测试的响应结果
            log.info("5-{}返回结果：{}".format(param["desc"],res.json()))
            assert param["expect_text"] in res.text
        except Exception as e:
            # 打印异常信息
            log.error("5-{}测试出现异常：{}".format(param["desc"],traceback.format_exc()))  # traceback.format_exc() 记录详细的出错信息
            # 抛出异常
            raise
